package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * JDK5之后,java推出了一个新特性:增强型for循环,也称为新循环
 * 新循环不取代传统for循环的工作.
 * 新循环是用来遍历集合或数组的
 * 语法:
 * for(元素类型 变量名 : 集合或数组){
 *     ...
 * }
 *
 */
public class NewForDemo {
    public static void main(String[] args) {
        String[] arr={"one","two","three","four","five"};
        for (int i = 0; i <arr.length ; i++) {
            String e=arr[i];
            System.out.println(e);
        }
        System.out.println();
       /*
            新循环是编译器认可的,编译器在编译时如果遇到使用新循环遍历数组,会将新循环改回成
            普通的for循环遍历
         */
        for (String e:arr){
            System.out.println(e);
        }
         /*
            JDK5之后另一个特性:泛型
            泛型又称为参数化类型,指我们在使用一个类时,可以指定该类中某属性,或方法参数或方法返回值的
            类型,使得使用时更加灵活.
            泛型在集合中被广泛使用,用于指定集合中的元素类型.
         */
        System.out.println();
        Collection<String> c=new ArrayList();
        /*
            Collection<E>
            方法:
            add(E e)

            当我们使用集合时就可以为E指定实际类型
            Collection<String> c = new ArrayList();
            此时该集合E就当做String了.
            因此使用该集合add方法是,参数类型就相当于:add(String e)

            若使用集合时不指定E的类型,那么E就会使用原形Object
         */
        c.add("一");
        c.add("二");
        c.add("三");
        c.add("四");
        c.add("五");
         /*
            编译器会将新循环遍历集合改为迭代器遍历
         */
        for (String e:c){
            System.out.println(e);
            //新循环遍历过程中不可以通过集合的方法增删元素
        }
       /*
            迭代器也支持泛型,与其遍历的集合元素类型一致即可
         */
        Iterator<String> it=c.iterator();
        while (it.hasNext()){
            String e=it.next();//此时next出的元素无需再造型
            System.out.println(e);
        }
    }
}
